package com.xbongbong.saas.model;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.domain.entity.PaasFormDataEntity;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.pro.businessdata.pojo.dto.FormatExplainDTO;
import com.xbongbong.pro.domain.entity.UpdateDataEntity;
import com.xbongbong.pro.formdata.pojo.dto.SaasAnalysisDataDTO;
import com.xbongbong.saas.domain.entity.ext.PayPlanSheetEntityExt;
import org.elasticsearch.action.support.WriteRequest;

import java.util.List;
import java.util.Map;

/**
 * @author feng.zheng
 * @version v1.0
 * @date 2019/1/25 10:18
 * @since v1.0
 */
public interface PayPlanSheetModel extends IModel<PayPlanSheetEntityExt> {

    /**
     * 批量更新
     * @author 吴峰
     * @date 2019/2/14 14:31
     * @param list  数据列表
     * @return 返回列表
     * @throws XbbException 业务异常
     */
    List<PayPlanSheetEntityExt> insertBatch(List<PayPlanSheetEntityExt> list) throws XbbException;

    /**
     * 批量插入
     * @author zcp
     * @param list  数据列表
     * @param refreshPolicy  刷新策略
     * @return 返回列表
     * @throws XbbException 业务异常
     */
    List<PayPlanSheetEntityExt> insertBatch(List<PayPlanSheetEntityExt> list, WriteRequest.RefreshPolicy refreshPolicy) throws XbbException;

    /**
     * 根据data里某个条件搜索
     *
     * @param attr   data里属性
     * @param value  data里属性的值
     * @param param 参数
     */
    Integer getCountByOneCondition(String attr, Object value, Map<String,Object> param);

    /**
     * 批量更新
     * @param list  数据列表
     * @param corpid 公司id
     * @return Integer
     * @throws XbbException XbbException
     */
    Integer updateBatch(List<UpdateDataEntity> list, String corpid) throws XbbException;

    /**
     * 批量更新付款单的审批状态，当有父子付款时，需要同步更新父子审批状态
     * @param list 数据列表
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Integer updateFlowStatusBatch(List<UpdateDataEntity> list, String corpid) throws XbbException;

    /**
     * 保存
     *
     * @param paymentEntity 数据实体
     * @author GuoJun.HU
     * @since V1.0
     * @return Integer
     * @date 2019/2/19 10:15
     * @throws XbbException XbbException
     */
    Integer save(PayPlanSheetEntityExt paymentEntity) throws XbbException;

    /**
     * 获取单个实体
     * @author 吴峰
     * @date 2019/2/18 14:43
     * @param key 数据id
     * @param corpid  公司id
     * @return com.xbongbong.saas.domain.entity.ext.PaymentEntityExt
     */
    PayPlanSheetEntityExt getByKey(Long key, String corpid);

    /**
     * 单个删除
     * @param id
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer deleteByKey(Long id,String corpid) throws XbbException;

    /**
     * 批量删除
     * @author 吴峰
     * @date 2019/2/14 14:45
     * @param formDataIdList id列表
     * @param corpid 公司id
     * @param del   删除标志
     * @return Integer
     * @throws XbbException XbbException
     */
    Integer deleteBatch(List<Long> formDataIdList, String corpid, Integer del) throws XbbException;

    /**
     * 批量删除
     * @author 吴峰
     * @date 2019/2/14 14:45
     * @param formDataIdList id列表
     * @param corpid 公司id
     * @param del   删除标志
     * @return Integer
     * @throws XbbException XbbException
     */
    Integer deleteBatch(List<Long> formDataIdList, String corpid, Integer del, WriteRequest.RefreshPolicy refreshPolicy) throws XbbException;
    
    /**
     * 批量更新主表中的数据，不更新子表单内数据
     * @author chenshan
     * @date 2019/11/28 21:27
     * @param list 更新的数据
     * @param corpid 公司id
     * @return
     * @throws XbbException
     */
    Integer updateBatchForData(List<? extends PaasFormDataEntity> list, String corpid) throws XbbException;


    /**
     * 资金账户刷流水日志需要的付款单
     * @param param 入参
     * @return 付款单集合
     */
    List<PayPlanSheetEntityExt> getPaySheetByCorpidScript(Map<String, Object> param);

    /**
     * 获取付款单表的公司list，减少循环主体
     * @return java.util.List<java.lang.String>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<String> getCorpidList();

    /**
     * 获取影响到预付款的付款单
     * @param param
     * @return java.util.List<com.xbongbong.saas.domain.entity.ext.PayPlanSheetEntityExt>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<PayPlanSheetEntityExt> findAffectBalanceEntitys(Map<String, Object> param);

    List<PayPlanSheetEntityExt> getPaySheetByIdIn(String corpid,List<Long> paySheetIdIn);

    /**
     * 得到符合条件最大的id
     * @param param
     * @return java.lang.Long
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Long getMaxId(Map<String, Object> param);

    /**
     * 进项发票回滚专用(其他需要查询走es)
     * @param corpid
     * @param uuidIn
     * @return
     */
    List<PayPlanSheetEntityExt> getParentAndSubPaySheet(String corpid,List<String> uuidIn);

    Integer updateBatch(List<UpdateDataEntity> updateList, String corpid, WriteRequest.RefreshPolicy refreshPolicy) throws XbbException;
    Integer updateBatch(List<UpdateDataEntity> updateList, String corpid, boolean needThrow) throws XbbException;

    List<PayPlanSheetEntityExt> findEntitysWithoutSub(Map<String, Object> param);

    /**
     * 编辑时格式化解释
     *
     * @param formatExplainDTO 入参
     * @throws XbbException 异常
     */
    void formatUpdateExplain(FormatExplainDTO formatExplainDTO) throws XbbException;

    /**
     * 编辑时将获取数据格式化
     *
     * @param formDataUpdateGetDTO saas编辑数据
     * @param result               要返回的jsonobject
     * @throws XbbException 业务异常
     * @author feng.zheng
     * @date 2019/1/22 15:28
     */
    void formatData(SaasAnalysisDataDTO formDataUpdateGetDTO, JSONObject result) throws XbbException;

    /**
     * 更新付款单时间
     *
     * @param dataId
     * @param corpid
     */
    void updateTime(Long dataId, String corpid) throws XbbException;
}
